package org.tri.gui.worker;

import java.util.ArrayList;
import java.util.List;
import org.tri.entity.Animal;
import org.tri.entity.Compra;
import org.tri.gui.worker.exceptions.AnimalDuplicadoException;
import org.tri.persistence.search.BusquedaAnimal;

/**
 * La clase {@code CompraPersistenceWorker} añade un checkeo de consistencia de
 * los animales comprados al {@code PersistentWorker} genérico, para evitar
 * que se inserte una compra inválida.
 * @author kiira
 * @version 1.0, Mar 1, 2012
 */
public class CompraPersistenceWorker extends PersistenceWorker {

    /**
     * Inicializa el worker indicando la compra a persistir e indicando si
     * se debe evictear la misma una vez persistida.
     * @param toSave compra a guardar.
     * @param evictLater bandera que indica si evictear (true) o no (fals) la
     * compra una vez persistida.
     */
    public CompraPersistenceWorker( Compra toSave, boolean evictLater ) {
        super( toSave, evictLater );
        
    }//end constructor
    
    /**
     * {@inheritDoc} 
     */
    @Override
    protected Object doInBackground() throws Exception {
        //checkeos previos para comprobar que la compra es válida
        Compra compra = (Compra)objectToSave;
        
        //comprobamos que las caravanas insertadas no esten repetidas
        List<Animal> animales = compra.getAnimales();
        List<String> caravanas = new ArrayList<String>( animales.size() );
        
        for ( Animal animal : animales ) 
            if ( animal.getIdAnimal() == 0 ) 
                caravanas.add( animal.getCaravana() );
                
        if ( caravanas.size() > 0 ) {
            BusquedaAnimal busqueda = new BusquedaAnimal();
            busqueda.porCaravanaEn( caravanas );

            List<Animal> resultado = busqueda.listarResultados();
            if ( resultado.size() > 0 )
                throw new AnimalDuplicadoException( resultado );

        }//end if
        
        //realizamos la persistencia
        return super.doInBackground();
        
    }//end método doInBackground    

}//end clase CompraPersistenceWorker